﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace PCDoctor.ScanParameters
{
    public class ScanParameterFactory
    {
        protected ScanParameterDBGateway DBGateway { get; set; }

        public ScanParameterFactory()
        {
            DBGateway = new ScanParameterDBGateway();
        }

        /// <summary>
        /// получаем параметры сканирования определенного типа
        /// </summary>
        /// <param name="kind">тип параметров сканирования или 0 если все типы</param>
        /// <returns>List of ScanParameter</ScanParameter></returns>
        public List<ScanParameter> getScanParameters(int kind)
        {
            IDictionary<Int64, ScanParameter> dict = new Dictionary<Int64, ScanParameter>();
            DataTable dbParameters = null;
            if (kind == 0)
            {
                //Если тип = 0, то вернуть все параметры
                //и ни ипать мозг
                dbParameters = DBGateway.getAll();
            }
            else
            {
                dbParameters = DBGateway.getAll(kind);
            }
            //Создаем экземпляры ScanParameter
            foreach (DataRow r in dbParameters.Rows)
            {
                ScanParameter sp = null;
                if (dict.ContainsKey((Int64)r["problem_id"]))
                {
                    dict[(Int64)r["problem_id"]].AddParameter(
                        (string)r["path"],
                        (string)r["value"]
                    );
                }
                else
                {
                    switch ((Int64)r["fixer_kind"])
                    {
                        case (byte)ScanFixerKinds.FileSystem:
                            sp = new FileSystemScanParameter(
                                    (string)r["name"],
                                    (string)r["path"],
                                    (string)r["value"],
                                    (Int64)r["problem_id"]);
                            break;
                        case (byte)ScanFixerKinds.Registy:
                            sp = new RegistryScanParameter(
                                    (string)r["name"],
                                    (string)r["path"],
                                    (string)r["value"],
                                    (Int64)r["problem_id"]);
                            break;
                        case (byte)ScanFixerKinds.Services:
                            sp = new ServicesScanParameter(
                                    (string)r["name"],
                                    (string)r["path"],
                                    (string)r["value"],
                                    (Int64)r["problem_id"]);
                            break;
                        case (byte)ScanFixerKinds.Gaming:
                            sp = new GameModeParameter(
                                    (string)r["name"],
                                    (string)r["path"],
                                    (string)r["value"],
                                    (Int64)r["problem_id"]);
                            break;
                    }
                    dict.Add((Int64)r["problem_id"], sp);
                }
            }
            List<ScanParameter> result = new List<ScanParameter>();
            foreach (ScanParameter s in dict.Values)
            {
                result.Add(s);
            }
            return result;
        }

        public List<ScanParameter> getAllScanParameters()
        {
            return getScanParameters(0);
        }

        public List<ScanParameter> getGamingParameters()
        {
            return getScanParameters(4);
        }
    }
}
